package cn.likun.kit.validate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * @作者 SUCH
 * @日期 2017-3-14 上午10:45:16
 * @描述 数据类型校验工具类
 */
public class ValidateDataType {

	public static final String DATE = "yyyy-MM-dd";
	public static final String DATE_SLASH = "yyyy/MM/dd";
	public static final String DATE_CHINA = "yyyy年MM月dd日";
	public static final String DATE_NUMBER = "yyyyMMdd";
	public static final String TIME = "HH:mm:ss";
	public static final String TIME_CHINA = "HH时mm分ss秒";
	public static final String TIME_NUMBER = "HHmmss";
	public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
	public static final String DATE_TIME_SLASH = "yyyy/MM/dd HH:mm:ss";
	public static final String DATE_TIME_CHINA = "yyyy年MM月dd日 HH时mm分ss秒";
	public static final String DATE_TIME_NUMBER = "yyyyMMddHHmmss";
	public static final String MILLI_SECOND = "SSS";
	
	public static List<String> dateFormats = new ArrayList<String>();
	static {
		dateFormats.add(DATE);
		dateFormats.add(DATE_SLASH);
		dateFormats.add(DATE_CHINA);
		dateFormats.add(DATE_NUMBER);
		dateFormats.add(TIME);
		dateFormats.add(TIME_CHINA);
		dateFormats.add(TIME_NUMBER);
		dateFormats.add(DATE_TIME);
		dateFormats.add(DATE_TIME_SLASH);
		dateFormats.add(DATE_TIME_CHINA);
		dateFormats.add(DATE_TIME_NUMBER);
	}

	/**
	 * <p>方法名：validateShort</p>
	 * <p>描述：判断字符串是否为短整型</p>
	 * @param str 需验证的字符串
	 * @return boolean true 为是
	 */
	public static boolean validateShort(String str) {
		boolean bool = false;
		if ("NaN".equals(str)) {
			return bool;
		}
		try {
			Short.parseShort(str);
			bool = true;
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	/**
	 * <p>方法名：validateInteger</p>
	 * <p>描述：判断字符串是否为整型</p>
	 * @param str 需验证的字符串
	 * @return boolean true 为是
	 */
	public static boolean validateInteger(String str) {
		boolean bool = false;
		if ("NaN".equals(str)) {
			return bool;
		}
		try {
			Integer.parseInt(str);
			bool = true;
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	/**
	 * <p>方法名：validateLong</p>
	 * <p>描述：判断字符串是否为长整型</p>
	 * @param str 需验证的字符串
	 * @return boolean true 为是
	 */
	public static boolean validateLong(String str) {
		boolean bool = false;
		if ("NaN".equals(str)) {
			return bool;
		}
		try {
			Long.parseLong(str);
			bool = true;
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	/**
	 * <p>方法名：validateFloat</p>
	 * <p>描述：判断字符串是否为单精度浮点型</p>
	 * @param str 需验证的字符串
	 * @return boolean true 为是
	 */
	public static boolean validateFloat(String str) {
		boolean bool = false;
		if ("NaN".equals(str)) {
			return bool;
		}
		try {
			Float.parseFloat(str);
			bool = true;
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	/**
	 * <p>方法名：validateDouble</p>
	 * <p>描述：判断字符串是否为双精度浮点型</p>
	 * @param str 需验证的字符串
	 * @return boolean true 为是
	 */
	public static boolean validateDouble(String str) {
		boolean bool = false;
		if ("NaN".equals(str)) {
			return bool;
		}
		try {
			Double.parseDouble(str);
			bool = true;
		} catch (Exception e) {
			bool = false;
		}
		return bool;
	}

	/**
	 * <p>方法名：validataDate</p>
	 * <p>描述：判断字符串是否为时间类型</p>
	 * @param str 需验证的字符串
     * @param format 时间格式
	 * @return boolean true 为是
	 */
	public static boolean validataDate(String str, String format) {
		boolean bool = false;
		try {
			if (ValidateCommons.isEmpty(format)) {
				for (String tempFormat : dateFormats) {
					bool = validataDate(str, tempFormat);
					if (bool == true) {
						break;
					}
				}
			} else {
				SimpleDateFormat sfd = new SimpleDateFormat(format);
				sfd.parse(str);
				bool = true;
			}
		} catch (ParseException e) {
			bool = false;
		}
		return bool;
	}

	/**
	 * <p>方法名：validataDate</p>
	 * <p>描述：判断字符串是否为时间类型</p>
	 * @param str 需验证的字符串
	 * @return boolean true 为是
	 */
	public static boolean validataDate(String str) {
		return validataDate(str, null);
	}

	/**
	 * <p>方法名：getDefaultDateFormat</p>
	 * <p>描述：获取默认的日期格式</p>
	 * @param str 需验证的字符串
	 * @return 日期格式
	 */
	public static String getDefaultDateFormat(String str) {
		String format = "";
		for (String tempFormat : dateFormats) {
			if (validataDate(str, tempFormat)) {
				format = tempFormat;
				break;
			}
		}
		return format;
	}

}
